package juc_synchronized;

import java.util.concurrent.CyclicBarrier;

/**
 * ClassName: CyclicBarrierTest
 * Package: juc_synchronized
 *
 * @Author 马学兴
 * @Create 2024/3/17 14:53
 * @Version 1.0
 * Description:Barrier 是阻拦的意思，他和 CountDownLatch 有点类似，当指定的线程数都执行到某个位置的时候，
 * 他才会继续往下执行。主要特点是可以让几个线程相互等待，就像被一道围栏给阻塞了一样，等到人齐了，在一同往下执行。
 *
 * 同步的原因：通过跟踪方法的实现逻辑可以知道，CycliBarrier 主要是依赖于 ReenTrantLock 来实现线程同步安全的。
 */
public class CyclicBarrierTest {
    static CyclicBarrier barrier = new CyclicBarrier(3);
    static int sum1 = 0; // 1 到 100 相加
    static int sum2 = 0; // 101 到 200 相加
    public static void main (String[] args) {
        // 线程 1
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 执行 1 到 10 相加
                for (int i = 1; i <= 100; i++) {
                    sum1 += i;
                }
                // 进入等待
                try {
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        // 线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 执行 101 到 200 相加
                for (int i = 101; i <= 200; i++) {
                    // 假设每次执行相加都会花一些时间
                    sum1 += i;
                }
                // 进入等待
                try {
                    barrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        // 等到两个线程都执行完，在把他们相加
        try {
            barrier.await();
            System.out.println("最终的结果：" + (sum1 + sum2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
